package application

import (
	"github.com/labstack/echo/v4"
	"github.com/minio/minio-go/v7"
	"mime/multipart"
	"net/http"
	"ruoyi-go-echo-ddd/internal/domain/service"
)

type MinioApplication struct {
	service *service.MinioService
}

func NewMinioApplication(s *service.MinioService) *MinioApplication {
	return &MinioApplication{
		service: s,
	}
}

// Upload 上传单个文件
//
// 参数
//
//   - ctx (context.Context): 上下文
//   - form (*multipart.Form): 表单对象
//   - bucket (string): 桶名称
//
// 返回
//
//   - string: 文件访问URL
//   - error: 错误信息
func (a *MinioApplication) Upload(e echo.Context, form *multipart.Form, bucket string) (string, error) {
	return a.service.Upload(e.Request().Context(), form, bucket)
}

// UploadFiles 上传多个文件
//
// 参数
//
//   - ctx (context.Context): 上下文
//   - form (*multipart.Form): 表单对象
//   - bucket (string): 桶名称
//
// 返回
//
//   - []string: 文件访问URL切片
//   - error: 错误信息
func (a *MinioApplication) UploadFiles(e echo.Context, form *multipart.Form, bucket string) ([]string, error) {
	return a.service.UploadFiles(e.Request().Context(), form, bucket)
}

// UploadPrefix 上传文件
//
// 参数
//
//   - ctx (context.Context): 上下文
//   - form (*multipart.Form): 表单对象
//   - bucket (string): 桶名称
//
// 返回
//
//   - []string: 文件访问URL切片
//   - error: 错误信息
func (a *MinioApplication) UploadPrefix(e echo.Context, form *multipart.Form, bucket string) ([]string, error) {
	return a.service.UploadPrefix(e.Request().Context(), form, bucket)
}

// Delete 删除文件
//
// 参数
//
//   - ctx (context.Context): 上下文
//   - bucket (string): 桶名称
//   - list ([]string): 文件名称切片
//
// 返回
//
//   - int64: 结果条数
//   - error: 错误信息
func (a *MinioApplication) Delete(e echo.Context, bucket string, list []string) (int64, error) {
	return a.service.Delete(e.Request().Context(), bucket, list)
}

func (a *MinioApplication) GetStatObject(e echo.Context, bucket, object string) (minio.ObjectInfo, error) {
	return a.service.GetStatObject(e.Request().Context(), bucket, object)
}

// FileInputByte 获取文件字节
//
// 参数
//
//   - ctx (context.Context): 上下文
//   - bucket (string): 桶名称
//   - name (string): 文件名称
//
// 返回
//
//   - []byte: 字节
//   - error: 错误信息
func (a *MinioApplication) FileInputByte(e echo.Context, w http.ResponseWriter, bucket string, objectName, dstFile string, size int64) ([]byte, int64, error) {
	return a.service.FileInputByte(e.Request().Context(), w, bucket, objectName, dstFile, size)
}

// DownloadObjectWithResume 下载
func (a *MinioApplication) DownloadObjectWithResume(e echo.Context, bucket, objectName, dstPath string, partSize int64) error {
	return a.service.DownloadObjectWithResume(e.Request().Context(), bucket, objectName, dstPath, partSize)
}

// DownloadResponseWithResume 下载
func (a *MinioApplication) DownloadResponseWithResume(e echo.Context, w http.ResponseWriter, bucket, objectName string, cacheSize int64) error {
	return a.service.DownloadResponseWithResume(e.Request().Context(), w, bucket, objectName, cacheSize)
}

// DownloadObjectListToZip 下载文件并生成ZIP流
//
// 参数
//
//   - e echo.Context: 上下文，用于取消或超时控制
//   - w io.Writer: 响应写入器，ZIP文件将写入其中
//   - bucket (string): 桶名称
//   - objectList ([]string): 文件名切片，要下载的对象列表
//   - cacheSize (int64): 缓冲区大小（字节），建议设置 64*1024
//
// 返回
//
//   - error: 返回错误
func (a *MinioApplication) DownloadObjectListToZip(e echo.Context, w http.ResponseWriter, bucket string, objectList []string, cacheSize int64) error {
	return a.service.DownloadObjectListToZip(e.Request().Context(), w, bucket, objectList, cacheSize)
}

// DownloadObjectListToZipParallel 并行下载文件并生成ZIP流
//
// 参数
//
//   - e echo.Context: 上下文，用于取消或超时控制
//   - w io.Writer: 响应写入器，ZIP文件将写入其中
//   - bucket (string): 桶名称
//   - objectList ([]string): 文件名切片，要下载的对象列表
//   - cacheSize (int64): 缓冲区大小（字节），建议设置 64*1024
//   - concurrency (int64): 并行下载数量，控制同时下载的文件数
//
// 返回
//
//   - error: 返回错误
func (a *MinioApplication) DownloadObjectListToZipParallel(e echo.Context, w http.ResponseWriter, bucket string, objectList []string, cacheSize, concurrency int64) error {
	return a.service.DownloadObjectListToZipParallel(e.Request().Context(), w, bucket, objectList, cacheSize, concurrency)
}
